#include "util.h"

void Util::serializeUshort(QDomElement& elem, QDomDocument& doc, const QString& tag, unsigned short value) {
    serialize(elem, doc, tag, QString::number(value));
}

void Util::serializeBool(QDomElement& elem, QDomDocument& doc, const QString& tag, bool value) {
    serialize(elem, doc, tag, value? "True": "False");
}

void Util::serializeFloat(QDomElement& elem, QDomDocument& doc, const QString& tag, float value) {
    serialize(elem, doc, tag, QString::number(value));
}

void Util::serialize(QDomElement& elem, QDomDocument& doc, const QString& tag, const QString& value) {
    QDomElement el = doc.createElement(tag);
    QDomText txt = doc.createTextNode(value);
    el.appendChild(txt);
    elem.appendChild(el);
}

bool Util::deserializeUshort(const QDomElement& elem, const QString& tag, unsigned short& value) {
    QString res;
    if (!data(elem, tag, res)) {
        return false;
    }
    value = res.toUShort();
    return true;
}

bool Util::deserializeBool(const QDomElement& elem, const QString& tag, bool& value) {
    QString res;
    if (!data(elem, tag, res)) {
        return false;
    }
    value = (res == "True");
    return true;
}

bool Util::deserializeFloat(const QDomElement& elem, const QString& tag, float& value) {
    QString res;
    if (!data(elem, tag, res)) {
        return false;
    }
    value = res.toFloat();
    return true;
}

bool Util::deserializeString(const QDomElement& elem, const QString& tag, QString& value) {
    QDomNodeList dnl = elem.elementsByTagName(tag);
    if (dnl.count() != 1) {
        return false;
    }
    QDomElement de = dnl.at(0).toElement();
    if (de.isNull()) {
        return false;
    }
    QDomText dt = de.firstChild().toText();
    value = dt.data();
    return true;
}

bool Util::data(const QDomElement& elem, const QString& tag, QString& res) {
    QDomNodeList dnl = elem.elementsByTagName(tag);
    if (dnl.count() != 1) {
        return false;
    }
    QDomElement de = dnl.at(0).toElement();
    if (de.isNull()) {
        return false;
    }
    QDomText dt = de.firstChild().toText();
    if (dt.isNull()) {
        return false;
    }
    res = dt.data();
    return true;
}
